#!/bin/bash

function usage {
    echo "使用方法: $0 [-h] [-s source_file] [-o output_file] [-t target_encoding]"
    echo "选项:"
    echo "  -h, --help           显示帮助信息并退出"
    echo "  -s source_file       指定源文件路径"
    echo "  -o output_file       指定输出文件路径"
    echo "  -t target_encoding   指定目标编码（默认: UTF-8）"
    echo
    echo "警告: 如果文件没有乱码，不建议使用此脚本，以防意外损坏文件。"
}

# 没有提供参数时显示帮助
if [ $# -eq 0 ]; then
    usage
    exit 1
fi

# 默认目标编码为 UTF-8
TARGET_ENCODING="UTF-8"

# 解析命令行参数
while [[ "$#" -gt 0 ]]; do
    case $1 in
        -h|--help) usage; exit 0 ;;
        -s) SOURCE_FILE="$2"; shift ;;
        -o) OUTPUT_FILE="$2"; shift ;;
        -t) TARGET_ENCODING="$2"; shift ;;
        *) echo "未知选项: $1" >&2; usage; exit 1 ;;
    esac
    shift
done

# 检查是否指定了源文件和输出文件
if [ -z "$SOURCE_FILE" ] || [ -z "$OUTPUT_FILE" ]; then
    echo "错误: 必须指定源文件和输出文件。"
    usage
    exit 1
fi

# 检测文件中是否包含中文字符
if grep -qP "[\x{4e00}-\x{9fff}]" "$SOURCE_FILE"; then
    # 文件包含中文
    ENCODINGS=("GBK" "CP936" "GB18030" "BIG5" "iso-8859-1")
else
    # 文件不包含中文，使用 file 命令检测编码
    ENCODING=$(file -bi "$SOURCE_FILE" | sed -e 's/.*[ ]charset=//')
    if [ "$ENCODING" == "us-ascii" ]; then
        echo "文件已经是 us-ascii 编码，无需转换。"
        exit 0
    fi
    ENCODINGS=("$ENCODING")
fi

# 尝试转换编码
for enc in "${ENCODINGS[@]}"
do
    iconv -f "$enc" -t "$TARGET_ENCODING" "$SOURCE_FILE" > "$OUTPUT_FILE" 2> /dev/null
    if [ $? -eq 0 ]; then
        echo "转换成功，使用编码: $enc"
        exit 0
    fi
done

echo "所有编码尝试失败，无法转换文件。"
